use ostree_sys::*;
use std::path::PathBuf;
+#[cfg(any(feature = "v2018_2", feature = "dox"))]
mod repo_checkout_filter;
-
+#[cfg(any(feature = "v2018_2", feature = "dox"))]
pub use self::repo_checkout_filter::RepoCheckoutFilter;
pub struct RepoCheckoutAtOptions {
pub enable_fsync: bool,
pub process_whiteouts: bool,
pub no_copy_fallback: bool,
+ #[cfg(any(feature = "v2017_6", feature = "dox"))]
pub force_copy: bool,
+ #[cfg(any(feature = "v2017_7", feature = "dox"))]
pub bareuseronly_dirs: bool,
+ #[cfg(any(feature = "v2018_9", feature = "dox"))]
pub force_copy_zerosized: bool,
pub subpath: Option<PathBuf>,
pub devino_to_csum_cache: Option<RepoDevInoCache>,
/// an FFI boundary and into the libostree C code (which is Undefined Behavior). If you prefer to
/// swallow the panic rather than aborting, you can use `std::panic::catch_unwind` inside your
/// callback to catch and silence any panics that occur.
+ #[cfg(any(feature = "v2018_2", feature = "dox"))]
pub filter: Option<RepoCheckoutFilter>,
+ #[cfg(any(feature = "v2017_6", feature = "dox"))]
pub sepolicy: Option<SePolicy>,
pub sepolicy_prefix: Option<String>,
}
enable_fsync: false,
process_whiteouts: false,
no_copy_fallback: false,
+ #[cfg(feature = "v2017_6")]
force_copy: false,
+ #[cfg(feature = "v2017_7")]
bareuseronly_dirs: false,
+ #[cfg(feature = "v2018_9")]
force_copy_zerosized: false,
subpath: None,
devino_to_csum_cache: None,
+ #[cfg(feature = "v2018_2")]
filter: None,
+ #[cfg(feature = "v2017_6")]
sepolicy: None,
sepolicy_prefix: None,
}
options.enable_fsync = self.enable_fsync.to_glib();
options.process_whiteouts = self.process_whiteouts.to_glib();
options.no_copy_fallback = self.no_copy_fallback.to_glib();
- options.force_copy = self.force_copy.to_glib();
- options.bareuseronly_dirs = self.bareuseronly_dirs.to_glib();
- options.force_copy_zerosized = self.force_copy_zerosized.to_glib();
+
+ #[cfg(feature = "v2017_6")]
+ {
+ options.force_copy = self.force_copy.to_glib();
+ }
+
+ #[cfg(feature = "v2017_7")]
+ {
+ options.bareuseronly_dirs = self.bareuseronly_dirs.to_glib();
+ }
+
+ #[cfg(feature = "v2018_9")]
+ {
+ options.force_copy_zerosized = self.force_copy_zerosized.to_glib();
+ }
// We keep these complex values alive by returning them in our Stash. Technically, some of
// these are being kept alive by `self` already, but it's better to be consistent here.
options.sepolicy_prefix = sepolicy_prefix.0;
let devino_to_csum_cache = self.devino_to_csum_cache.to_glib_none();
options.devino_to_csum_cache = devino_to_csum_cache.0;
- let sepolicy = self.sepolicy.to_glib_none();
- options.sepolicy = sepolicy.0;
- if let Some(filter) = &self.filter {
- options.filter_user_data = filter.to_glib_none().0;
- options.filter = Some(repo_checkout_filter::filter_trampoline_unwindsafe);
+ #[cfg(feature = "v2017_6")]
+ let sepolicy = {
+ let sepolicy = self.sepolicy.to_glib_none();
+ options.sepolicy = sepolicy.0;
+ sepolicy
+ };
+ #[cfg(not(feature = "v2017_6"))]
+ let sepolicy = None.to_glib_none();
+
+ #[cfg(feature = "v2018_2")]
+ {
+ if let Some(filter) = &self.filter {
+ options.filter_user_data = filter.to_glib_none().0;
+ options.filter = Some(repo_checkout_filter::filter_trampoline_unwindsafe);
+ }
}
Stash(
#[cfg(test)]
mod tests {
use super::*;
- use crate::RepoCheckoutFilterResult;
- use gio::{File, NONE_CANCELLABLE};
use glib_sys::{GFALSE, GTRUE};
use std::ffi::{CStr, CString};
use std::ptr;
assert_eq!((*ptr).enable_fsync, GFALSE);
assert_eq!((*ptr).process_whiteouts, GFALSE);
assert_eq!((*ptr).no_copy_fallback, GFALSE);
+ #[cfg(feature = "v2017_6")]
assert_eq!((*ptr).force_copy, GFALSE);
+ #[cfg(feature = "v2017_7")]
assert_eq!((*ptr).bareuseronly_dirs, GFALSE);
+ #[cfg(feature = "v2018_9")]
assert_eq!((*ptr).force_copy_zerosized, GFALSE);
assert_eq!((*ptr).unused_bools, [GFALSE; 4]);
assert_eq!((*ptr).subpath, ptr::null());
assert_eq!((*ptr).devino_to_csum_cache, ptr::null_mut());
assert_eq!((*ptr).unused_ints, [0; 6]);
assert_eq!((*ptr).unused_ptrs, [ptr::null_mut(); 3]);
+ #[cfg(feature = "v2018_2")]
assert_eq!((*ptr).filter, None);
+ #[cfg(feature = "v2018_2")]
assert_eq!((*ptr).filter_user_data, ptr::null_mut());
+ #[cfg(feature = "v2017_6")]
assert_eq!((*ptr).sepolicy, ptr::null_mut());
assert_eq!((*ptr).sepolicy_prefix, ptr::null());
}
enable_fsync: true,
process_whiteouts: true,
no_copy_fallback: true,
+ #[cfg(feature = "v2017_6")]
force_copy: true,
+ #[cfg(feature = "v2017_7")]
bareuseronly_dirs: true,
+ #[cfg(feature = "v2018_9")]
force_copy_zerosized: true,
subpath: Some("sub/path".into()),
devino_to_csum_cache: Some(RepoDevInoCache::new()),
- filter: RepoCheckoutFilter::new(|_repo, _path, _stat| RepoCheckoutFilterResult::Skip),
- sepolicy: Some(SePolicy::new(&File::new_for_path("a/b"), NONE_CANCELLABLE).unwrap()),
+ #[cfg(feature = "v2018_2")]
+ filter: RepoCheckoutFilter::new(|_repo, _path, _stat| {
+ crate::RepoCheckoutFilterResult::Skip
+ }),
+ #[cfg(feature = "v2017_6")]
+ sepolicy: Some(
+ SePolicy::new(&gio::File::new_for_path("a/b"), gio::NONE_CANCELLABLE).unwrap(),
+ ),
sepolicy_prefix: Some("prefix".into()),
};
let stash = options.to_glib_none();
assert_eq!((*ptr).enable_fsync, GTRUE);
assert_eq!((*ptr).process_whiteouts, GTRUE);
assert_eq!((*ptr).no_copy_fallback, GTRUE);
+ #[cfg(feature = "v2017_6")]
assert_eq!((*ptr).force_copy, GTRUE);
+ #[cfg(feature = "v2017_7")]
assert_eq!((*ptr).bareuseronly_dirs, GTRUE);
+ #[cfg(feature = "v2018_9")]
assert_eq!((*ptr).force_copy_zerosized, GTRUE);
assert_eq!((*ptr).unused_bools, [GFALSE; 4]);
assert_eq!(
);
assert_eq!((*ptr).unused_ints, [0; 6]);
assert_eq!((*ptr).unused_ptrs, [ptr::null_mut(); 3]);
+ #[cfg(feature = "v2018_2")]
assert!((*ptr).filter == Some(repo_checkout_filter::filter_trampoline_unwindsafe));
+ #[cfg(feature = "v2018_2")]
assert_eq!(
(*ptr).filter_user_data,
options.filter.as_ref().unwrap().to_glib_none().0,
);
+ #[cfg(feature = "v2017_6")]
assert_eq!((*ptr).sepolicy, options.sepolicy.to_glib_none().0);
assert_eq!(
CStr::from_ptr((*ptr).sepolicy_prefix),